Dump follows symlink and fails
Metadata
Current evaluation
No evaluation has been recorded for this issue yet.
Issue body
Hello,
when trying to use dump on a directory containing a relative symlink to another subdirectory of the source, dump follows the symlink instead of copying it.
The script at the following url reproduces a simple environment in which snapcraft exhibits the described error: https://gist.github.com/r4co0n/5766f0452cd5cc94e3b2b19959d48892
The following is snapcraft's debug output, note the additional "Checking if ...", "Found link ..." and "Migrating file ..." lines I added via some print() statements to find out what is going on.
Preparing to pull one
Pulling one
Preparing to build one
Building one
Checking if source /vagrant/parts/one/build/four is link. Destination is /vagrant/parts/one/install/four. Boundary is /vagrant/parts/one/install
Found link two. Normalized desination path is /vagrant/parts/one/install/two
Checking if source /vagrant/parts/one/build/two/three is link. Destination is /vagrant/parts/one/install/two/three. Boundary is /vagrant/parts/one/install
Staging one
Migrating file /vagrant/parts/one/install/two/three to /vagrant/stage/two/three
Migrating file /vagrant/parts/one/install/four/three to /vagrant/stage/four/three
Migrating file /vagrant/parts/one/install/four to /vagrant/stage/four
Traceback (most recent call last):
File "/usr/bin/snapcraft", line 9, in <module>
load_entry_point('snapcraft==2.39.3', 'console_scripts', 'snapcraft')()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 542, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2569, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2229, in load
return self.resolve()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2235, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/usr/lib/python3/dist-packages/snapcraft/cli/__main__.py", line 43, in <module>
run(prog_name='snapcraft')
File "/usr/lib/python3/dist-packages/click/core.py", line 716, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3/dist-packages/click/core.py", line 696, in main
rv = self.invoke(ctx)
File "/usr/lib/python3/dist-packages/click/core.py", line 1037, in invoke
return Command.invoke(self, ctx)
File "/usr/lib/python3/dist-packages/click/core.py", line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3/dist-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3/dist-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/lib/python3/dist-packages/snapcraft/cli/_runner.py", line 72, in run
ctx.forward(lifecyclecli.commands['snap'])
File "/usr/lib/python3/dist-packages/click/core.py", line 552, in forward
return self.invoke(cmd, **kwargs)
File "/usr/lib/python3/dist-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3/dist-packages/snapcraft/cli/lifecycle.py", line 139, in snap
project_options, directory=directory, output=output)
File "/usr/lib/python3/dist-packages/snapcraft/internal/lifecycle/_packer.py", line 46, in snap
execute('prime', project_options)
File "/usr/lib/python3/dist-packages/snapcraft/internal/lifecycle/_runner.py", line 79, in execute
_Executor(config, project_options).run(step, part_names)
File "/usr/lib/python3/dist-packages/snapcraft/internal/lifecycle/_runner.py", line 185, in run
self._run_step(step, part, part_names)
File "/usr/lib/python3/dist-packages/snapcraft/internal/lifecycle/_runner.py", line 222, in _run_step
getattr(part, step)()
File "/usr/lib/python3/dist-packages/snapcraft/internal/pluginhandler/__init__.py", line 477, in stage
self.stagedir, fixup_func=fixup_func)
File "/usr/lib/python3/dist-packages/snapcraft/internal/pluginhandler/__init__.py", line 841, in _migrate_files
os.remove(dst)
IsADirectoryError: [Errno 21] Is a directory: '/vagrant/stage/four'
Evaluation history
No evaluation history available.